package cn.yuanqiao.manage.service.impl;

import cn.yuanqiao.common.utils.DateUtils;
import cn.yuanqiao.common.utils.StringUtils;
import cn.yuanqiao.common.utils.SecurityUtils;
import cn.yuanqiao.manage.domain.YqdaCodelistModel;
import cn.yuanqiao.manage.domain.YqdaCoderuleModel;
import cn.yuanqiao.manage.mapper.YqdaCodelistModelMapper;
import cn.yuanqiao.manage.mapper.YqdaCoderuleModelMapper;
import cn.yuanqiao.manage.service.IYqdaCodelistModelService;
import cn.yuanqiao.common.core.domain.model.LoginUser;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * codelistService业务层处理
 * 
 * @author yuanqiao
 * @date 2023-06-15
 */
@Service
public class YqdaCodelistModelServiceImpl implements IYqdaCodelistModelService 
{
    @Autowired
    private YqdaCodelistModelMapper yqdaCodelistModelMapper;
    @Autowired
    private YqdaCoderuleModelMapper yqdaCoderuleModelMapper;
    /**
     * 查询codelist
     * 
     * @param Id codelist主键
     * @return codelist
     */
    @Override
    public YqdaCodelistModel selectYqdaCodelistModelById(Long Id)
    {
        return yqdaCodelistModelMapper.selectYqdaCodelistModelById(Id);
    }

    /**
     * 查询codelist列表
     * 
     * @param yqdaCodelistModel codelist
     * @return codelist
     */
    @Override
    public List<YqdaCodelistModel> selectYqdaCodelistModelList(YqdaCodelistModel yqdaCodelistModel)
    {
        return yqdaCodelistModelMapper.selectYqdaCodelistModelList(yqdaCodelistModel);
    }

    /**
     * 新增codelist
     * 
     * @param  json
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    public int insertYqdaCodelistModel(JSONObject json)
    {
        LoginUser user = SecurityUtils.getLoginUser();
        if(user == null){
            user = new LoginUser();
            user.setUserId(1L);
        }
        int type=json.getInteger("type");
        Long Id = json.getLong("id");
        JSONArray ziduanarr = json.getJSONArray("ziduanarr");
        JSONArray fuhaoarr = json.getJSONArray("fuhaoarr");
        JSONArray bulingarr = json.getJSONArray("bulingarr");
        YqdaCoderuleModel yqdaCoderuleModel=new YqdaCoderuleModel();
        yqdaCoderuleModel.setId(Id);
        String order = json.getString("order");
        if(StringUtils.isNotEmpty(order)){
            yqdaCoderuleModel.setOrderStr(json.getString("order").replace("$"," "));
        }
        yqdaCoderuleModel.seteColumnname("ARCHIVE_NO");
        for (int i = 0; i < ziduanarr.size(); i++) {
            YqdaCodelistModel yqdaCodelistModel=new YqdaCodelistModel();
            yqdaCodelistModel.setArchivalcodeRuleId(Id);
            yqdaCodelistModel.setType("著录项值");
            yqdaCodelistModel.setNodeValue(String.valueOf(ziduanarr.get(i)));
            if (i==ziduanarr.size()-1){
                yqdaCodelistModel.setLen(Integer.parseInt(bulingarr.get(i).toString()));
            }else{
                yqdaCodelistModel.setLen(0);
            }
            yqdaCodelistModel.setOrderNo(2*i+1);
            yqdaCodelistModel.setCreator(user.getUsername());
            yqdaCodelistModel.setCreatorId(user.getUserId());
            yqdaCodelistModel.setCreateTime(DateUtils.getNowDate());
            yqdaCodelistModel.setVFETYPE(0==type?"f":"v");
            yqdaCodelistModelMapper.insertYqdaCodelistModel(yqdaCodelistModel);
            if (i!=ziduanarr.size()-1){
                YqdaCodelistModel yqdaCodelistModel1=new YqdaCodelistModel();
                yqdaCodelistModel1.setArchivalcodeRuleId(Id);
                yqdaCodelistModel1.setType("固定值");
                yqdaCodelistModel1.setNodeValue(String.valueOf(fuhaoarr.get(i)));
                yqdaCodelistModel1.setLen(0);
                yqdaCodelistModel1.setOrderNo(2*(i+1));
                yqdaCodelistModel1.setCreator(user.getUsername());
                yqdaCodelistModel1.setCreatorId(user.getUserId());
                yqdaCodelistModel1.setCreateTime(DateUtils.getNowDate());
                yqdaCodelistModel1.setVFETYPE(0==type?"f":"v");
                yqdaCodelistModelMapper.insertYqdaCodelistModel(yqdaCodelistModel1);
            }
        }
        YqdaCodelistModel yqdaCodelistModel=new YqdaCodelistModel();
        yqdaCodelistModel.setArchivalcodeRuleId(Id);
        yqdaCodelistModel.setType("固定值");
        yqdaCodelistModel.setNodeValue(json.getString("filelianjie"));
        yqdaCodelistModel.setLen(0);
        yqdaCodelistModel.setOrderNo(0);
        yqdaCodelistModel.setCreator(user.getUsername());
        yqdaCodelistModel.setCreatorId(user.getUserId());
        yqdaCodelistModel.setCreateTime(DateUtils.getNowDate());
        yqdaCodelistModel.setVFETYPE("e");
        yqdaCodelistModelMapper.insertYqdaCodelistModel(yqdaCodelistModel);
        if (0==type){//组件方式
            yqdaCoderuleModel.setfColumnname(json.getString("columnname"));
        }else{//组卷 或 项目
            yqdaCoderuleModel.setvColumnname(json.getString("columnname"));
            yqdaCoderuleModel.setfColumnname(json.getString("jiancunchuziduan"));
            YqdaCodelistModel yqdaCodelistModel1=new YqdaCodelistModel();
            yqdaCodelistModel1.setArchivalcodeRuleId(Id);
            yqdaCodelistModel1.setType("著录项值");
            yqdaCodelistModel1.setNodeValue(json.getString("jianziduan"));
            yqdaCodelistModel1.setLen(json.getInteger("jianbuling"));
            yqdaCodelistModel1.setOrderNo(1);
            yqdaCodelistModel1.setCreator(user.getUsername());
            yqdaCodelistModel1.setCreatorId(user.getUserId());
            yqdaCodelistModel1.setCreateTime(DateUtils.getNowDate());
            yqdaCodelistModel1.setVFETYPE("f");
            yqdaCodelistModelMapper.insertYqdaCodelistModel(yqdaCodelistModel1);
            YqdaCodelistModel yqdaCodelistModel2=new YqdaCodelistModel();
            yqdaCodelistModel2.setArchivalcodeRuleId(Id);
            yqdaCodelistModel2.setType("固定值");
            yqdaCodelistModel2.setNodeValue(json.getString("jianlianjie"));
            yqdaCodelistModel2.setLen(0);
            yqdaCodelistModel2.setOrderNo(0);
            yqdaCodelistModel2.setCreator(user.getUsername());
            yqdaCodelistModel2.setCreatorId(user.getUserId());
            yqdaCodelistModel2.setCreateTime(DateUtils.getNowDate());
            yqdaCodelistModel2.setVFETYPE("f");
            yqdaCodelistModelMapper.insertYqdaCodelistModel(yqdaCodelistModel2);
        }

        return yqdaCoderuleModelMapper.updateYqdaCoderuleModel(yqdaCoderuleModel);
    }

    /**
     * 修改codelist
     * 
     * @param json codelist
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateYqdaCodelistModel(JSONObject json)
    {
        Long id=json.getLong("id");
        String order= json.getString("order");
        YqdaCoderuleModel yqdaCoderuleModel=new YqdaCoderuleModel();
        yqdaCoderuleModel.setId(id);
        yqdaCoderuleModel.setOrderStr(order);
        deleteYqdaCodelistModelByRuleId(id);
        yqdaCoderuleModelMapper.updateYqdaCoderuleModel(yqdaCoderuleModel);
        return insertYqdaCodelistModel(json);
    }

    private void deleteYqdaCodelistModelByRuleId(Long id) {
       int i= yqdaCodelistModelMapper.deleteYqdaCodelistModelByRuleId(id);
    }

    /**
     * 批量删除codelist
     * 
     * @param Ids 需要删除的codelist主键
     * @return 结果
     */
    @Override
    public int deleteYqdaCodelistModelByIds(Long[] Ids)
    {
        return yqdaCodelistModelMapper.deleteYqdaCodelistModelByIds(Ids);
    }

    /**
     * 删除codelist信息
     * 
     * @param Id codelist主键
     * @return 结果
     */
    @Override
    public int deleteYqdaCodelistModelById(Long Id)
    {
        return yqdaCodelistModelMapper.deleteYqdaCodelistModelById(Id);
    }

    @Override
    public JSONObject getdetail(String type,Long archivalcodeRuleId) {
        JSONObject json=new JSONObject();
        YqdaCodelistModel yqdaCodelistModel=new YqdaCodelistModel();
        yqdaCodelistModel.setArchivalcodeRuleId(archivalcodeRuleId);
        List<YqdaCodelistModel> yqdaCodelistModels = yqdaCodelistModelMapper.selectYqdaCodelistModelList(yqdaCodelistModel);
        List<String> ziduanarr=new ArrayList<String>();
        List<String> fuhaoarr=new ArrayList<String>();
        List<String> bulingarr=new ArrayList<String>();
        for (int i = 0; i < yqdaCodelistModels.size(); i++) {
            if(yqdaCodelistModels.get(i).getVFETYPE().equals(type)&&"著录项值".equals(yqdaCodelistModels.get(i).getType())){//件
                ziduanarr.add(yqdaCodelistModels.get(i).getNodeValue());
                bulingarr.add(String.valueOf(yqdaCodelistModels.get(i).getLen()));
            }else if(yqdaCodelistModels.get(i).getVFETYPE().equals(type)&&"固定值".equals(yqdaCodelistModels.get(i).getType())){ //卷 或 项目
                fuhaoarr.add(yqdaCodelistModels.get(i).getNodeValue());
            }else if("e".equals(yqdaCodelistModels.get(i).getVFETYPE())){
                json.put("filelianjie",yqdaCodelistModels.get(i).getNodeValue());
            }else{
                if("著录项值".equals(yqdaCodelistModels.get(i).getType())){
                    json.put("jianziduan",yqdaCodelistModels.get(i).getNodeValue());
                    json.put("jianbuling",yqdaCodelistModels.get(i).getLen());
                }else{
                    json.put("jianlianjie",yqdaCodelistModels.get(i).getNodeValue());
                }
            }
        }
        json.put("ziduanarr",ziduanarr);
        json.put("fuhaoarr",fuhaoarr);
        json.put("bulingarr",bulingarr);
        YqdaCoderuleModel yqdaCoderuleModel = yqdaCoderuleModelMapper.selectYqdaCoderuleModelById(archivalcodeRuleId);
        json.put("columnname","f".equals(type)?yqdaCoderuleModel.getfColumnname():yqdaCoderuleModel.getvColumnname());
        json.put("jiancunchuziduan",yqdaCoderuleModel.getfColumnname());
        json.put("order",yqdaCoderuleModel.getOrderStr());
        json.put("filecunchuziduan",yqdaCoderuleModel.geteColumnname());
        return json;
    }
}
